var mongodb = require('./db');
var markdown = require('markdown').markdown;

function Post(name, title, tags, post) {
	this.name = name;
	this.title = title;
	this.tags = tags;
	this.post = post;
}

module.exports = Post;

//存储文章及相关信息
Post.prototype.save = function(callback) {
	var date = new Date();
	//存储时间格式，方便以后拓展
	var time = {
		date: date,
		year: date.getFullYear(),
		month:date.getFullYear() + "-" + (date.getMonth() + 1),
		day: date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate(),
		minute: date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate() + ' ' + (date.getHours() < 10 ? '0' + date.getHours() :  date.getHours()) + ':' + (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes())
	};

	//存入数据库的数据
	var post = {
		name: this.name,
		time: time,
		title: this.title,
		tags: this.tags,
		post: this.post,
		comments: [],
		pv: 0
	};

	mongodb.open(function (err, db) {
		if (err) {
			return callback(err);
		}

		//读取posts集合
		db.collection('posts', function(err, collection) {
			if (err) {
				mongodb.close();
				return callback(err);
			}

			//将文档插入posts集合
			collection.insert(post, { safe: true}, function(err) {
				mongodb.close();
				if (err) {
					return callback(err);
				}
				callback(null);
			});
		});

	});
};

//读取文章及其相关信息
Post.getAll = function(name, callback) {
	mongodb.open(function (err, db) {
		if (err) {
			return callback(err);
		}

		//读取posts集合
		db.collection('posts', function(err, collection) {
			if (err) {
				mongodb.close();
				return callback(err);
			}
			var query = {};
			if (name) {
				query.name = name;
			}
			//根据query查询文章
			collection.find(query).sort({
				time: -1
			}).toArray(function (err, docs) {
				mongodb.close();
				if (err) {
					return callback(err);
				}

				//解析markdown为html
				docs.forEach(function(doc) {
					doc.post = markdown.toHTML(doc.post);
				});

				callback(null, docs);
			});
		});
	});
};

//获取一篇文章
Post.getOne = function (name, day, title, callback) {
	mongodb.open(function (err, db) {
		if (err) {
			return callback(err);
		}
		//读取posts集合
		db.collection('posts', function (err, collection) {
			if (err) {
				mongodb.close();
				return callback(err);
			}

			//用户名，日期， 文章名查询文章
			collection.findOne({
				"name": name,
				"time.day": day,
				"title": title
			}, function(err, doc) {
				if (err) {
					mongodb.close();
					return callback(err);
				}

				if (doc) {
					//每次访问PV加一
					collection.update({
						"name": name,
						"time.day": day,
						"title": title
					}, {
						$inc: { "pv": 1 }
					}, function (err) {
						mongodb.close();
						if (err) {
							return callback('err');
						}
					});
					
					doc.post = markdown.toHTML(doc.post);
					doc.comments.forEach(function (comment) {
						comment.content = markdown.toHTML(comment.content);
					});
				}

				
				callback(null, doc);
			});
		});
	});
};

//按标题查找
Post.edit = function (name, day, title, callback) {
	mongodb.open(function (err, db) {
		if (err) {
			return callback(err);
		}
		//读取posts集合
		db.collection('posts', function (err, collection) {
			if (err) {
				mongodb.close();
				return callback(err);
			}

			// 根据用户名，发表文章日期，文章名进行查询
			collection.findOne({
				"name": name,
				"time.day": day,
				"title": title
			}, function (err, doc) {
				mongodb.close();
				if (err) {
					return callback(err);
				}
				callback(null, doc);
			});
		});
	});
};

//更新文章内容
Post.update = function (name, day, title, post, callback) {
	mongodb.open(function (err, db) {
		if (err) {
			return callback(err);
		}
		//读取posts集合
		db.collection('posts', function (err, collection) {
			if (err) {
				mongodb.close();
				return callback(err);
			}
			//更新文章内容
			collection.update({
				"name": name,
				"time.day": day,
				"title": title
			}, {
				$set: {post: post}
			}, function (err) {
				mongodb.close();
				if (err) {
					return callback(err);
				}
				callback(null);
			});
		});
	});
};

Post.remove = function (name, day, title, callback) {
	//打开数据库
	mongodb.open(function (err, db) {
		if (err) {
			return callback(err);
		}

		db.collection('posts', function (err, collection) {
			if (err) {
				mongodb.close();
				return callback(err);
			}
			//根据用户名，日期，标题，查找并删除一篇文章
			collection.remove({
				'name': name,
				'time.day': day,
				'title': title
			}, {
				w: 1
			}, function (err) {
				mongodb.close();
				if (err) {
					return callback(err);
				}
				callback(null);
			});
		});
	});
};

//返回所有文章存档信息
Post.getArchive = function(callback) {
	//打开书数据库
	mongodb.open(function (err, db) {
		if (err) {
			return callback(err);
		}

		//读取posts集合
		db.collection('posts', function (err, collection) {
			if (err) {
				mongodb.close();
				return callback("2323234");
			}

			//返回只含有 name，time，title属性的文章组成的存档数组
			collection.find({}, {
				"name": 1,
				"time": 1,
				'title': 1
			}).sort({
				time: -1
			}).toArray(function(err, docs) {
				mongodb.close();
				if (err) {
					return callback(err);
				}
				callback(null, docs);
			});
		});
	});
};

Post.getTags = function (callback) {
	mongodb.open(function (err, db) {
		if (err) {
			return callback(err);
		}

		db.collection('posts', function (err, collection) {
			if (err) {
				return callback(err);
			}
			//distinct 用来找出给定键 的所有不同值
			collection.distinct("tags", function (err, docs) {
				mongodb.close();
				if (err) {
					return callback(err);
				}
				callback(null, docs);
			});
		});
	});
};

Post.getTag = function(tag, callback) {
	mongodb.open(function (err, db) {
		if (err) {
			return callback(err);
		}

		db.collection('posts', function (err, collection) {
			if (err) {
				mongodb.close();
				return callback(err);
			}

			//查询所有tags数组内包含tag的文档
			//并返回只有name, day, title组成的数组
			collection.find({
				"tags": tag
			}, {
				"name": 1,
				"time": 1,
				"title": 1
			}).sort({
				time: -1
			}).toArray(function (err, docs) {
				mongodb.close();
				if (err) {
					return callback(err);
				}
				callback(null, docs);
			});
		});
	});
};



Post.search = function(keyword, callback) {
	mongodb.open(function (err, db) {
		if (err) {
			return callback(err);
		}

		db.collection("posts", function (err, collection) {
			if (err) {
				mongodb.close();
				return callback(err);
			}

			var pattern = new RegExp(keyword, "i");
			collection.find({
				"title": pattern
			}, {
				"name": 1,
				"time": 1,
				"title": 1
			}).sort({
				time: -1
			}).toArray(function (err, docs) {
				mongodb.close();
				if (err) {
					return callback(err);
				}
				callback(null, docs);
			});
		});
	});
};